package com.dkd.day20250726;

import java.util.ArrayList;
import java.util.Scanner;

//小华和小为是很要好的朋友，他们约定周末一起吃饭。
//
//通过手机交流，他们在地图上选择了多个聚餐地点（由于自然地形等原因，部分聚餐地点不可达），求小华和小为都能到达的聚餐地点有多少个？
//
//输入描述
//第一行输入 m 和 n
//
//m 代表地图的长度
//n 代表地图的宽度
//第二行开始具体输入地图信息，地图信息包含：
//
//0 为通畅的道路
//1 为障碍物（且仅1为障碍物）
//2 为小华或者小为，地图中必定有且仅有2个 （非障碍物）
//3 为被选中的聚餐地点（非障碍物）
//输出描述
//可以被两方都到达的聚餐地点数量，行末无空格。
public class Main37 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int [][] grid = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                grid[i][j] = sc.nextInt();
            }
        }

        int answer=solve(grid);
        System.out.println(answer);
    }

    public static int solve(int[][] grid){
        int m = grid.length;
        int n = grid[0].length;

 // UnionFindSet ufs = new UnionFindSet();
        UnionFindSet ufs = new UnionFindSet(n*m);

        // 上下左右四个方向偏移量
        int[][] offsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

        ArrayList<Integer> huawi = new ArrayList<>();
        ArrayList<Integer> restaraunt = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] != 1) {
                    int pos = i*n + j;

                    if(grid[i][j] == 2){
                        huawi.add(pos);
                    }else if(grid[i][j] == 3){
                        restaraunt.add(pos);
                    }

                    for(int [] offset : offsets){
                        int newI = i+offset[0];
                        int newJ = j+offset[1];
                        if(newI >= 0 && newI < m && newJ >= 0 && newJ < n && grid[newI][newJ] != 1){
                            ufs.union(pos, newI * n + newJ);
                        }
                    }
                }



            }
        }

        int hua = huawi.get(0);
        int wei = huawi.get(1);

        if(ufs.find(hua) != ufs.find(wei)){
            return 0;
        }

        int answer = 0;
        for(Integer i : restaraunt){
            if(ufs.find(i) == ufs.find(hua)){
               answer++;
            }
        }
        return answer;
    }

    class UnionFindSet2{
        int[] fa;

        public UnionFindSet2(int n){
            fa = new int[n];
            for(int i = 0; i < n; i++) fa[i] = i;
        }

        public int findSet(int i){
            if(i!=fa[i]){
                this.fa[i] =this.findSet(fa[i]);
                return this.fa[i];
            }
            return i;

        }

        public void unionSet(int i, int j){
            int x_fa = fa[i];
            int y_fa = fa[j];
            if(x_fa != y_fa){
                this.fa[y_fa] = findSet(x_fa);
            };
        }

    }


    // 并查集实现
    static class UnionFindSet {
        int[] fa;

        public UnionFindSet(int n) {
            fa = new int[n];
            for (int i = 0; i < n; i++) fa[i] = i;
        }

        public int find(int x) {
            if (x != this.fa[x]) {
                this.fa[x] = this.find(this.fa[x]);
                return this.fa[x];
            }
            return x;
        }

        public void union(int x, int y) {
            int x_fa = this.find(x);
            int y_fa = this.find(y);

            if (x_fa != y_fa) {
                this.fa[y_fa] = x_fa;
            }
        }
    }
}
